package com.monkeyboy.utils;

import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 描述:时间格式转换(目前只针对LocalDateTime型时间格式进行操作)
 * 作者: 高嘉银 时间:2018年2月27日 下午3:59:20
 */
public class TimeHelper {
	/**
	 * 作用:
	 * 默认的时间格式
	 * 作者:gjy
	 * 时间:2018年3月6日 下午3:39:58
	 */
	public static final String format="yyyy-MM-dd HH:mm:ss";
	/**
	 * 描述:
	 * 时间枚举常量
	 * 作者: 高嘉银
	 * 时间:2018年3月6日 下午3:08:59 
	 */
	public enum DateName{
		YEAR,MONTH,DAY,HOUR,MINUTE,SECOND
	}
	/**
	 * 作用:
	 * 获取系统当前时间字符串
	 * 作者:gjy
	 * 时间:2018年2月28日 下午1:51:05
	 * @param format
	 * @return
	 */
	public static String getNowTime(String format) {
		DateTimeFormatter f = DateTimeFormatter.ofPattern(format);
		LocalDateTime str=LocalDateTime.now();
		return str.format(f);
	}

	/**
	 * 作用: 把data转换为字符串
	 *
	 * 作者:gjy 时间:2018年2月27日 下午4:07:14
	 * 
	 * @param date
	 * @param format
	 *            传入一个转换的格式（“yyyy-MM-dd HH:mm:ss”）
	 * @return
	 * @throws Exception
	 */
	public static String dateTimeToString(LocalDateTime date, String format) throws Exception {
		DateTimeFormatter str = DateTimeFormatter.ofPattern(format);
		String strDate = str.format(date);
		return strDate;
	}
	/**
	 * 作用：
	 * 把一个localDate型日期转换为字符串
	 * 作者：高嘉银
	 * 时间：2018年4月10日
	 * @param date
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static String dateTimeToString(LocalDate date, String format) throws Exception {
		DateTimeFormatter str = DateTimeFormatter.ofPattern(format);
		String strDate = str.format(date);
		return strDate;
	}
	/**
	 * 作用: 把时间字符串转换为时间格式类型 作者:gjy 时间:2018年2月27日 下午4:26:16
	 * 
	 * @param date
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static LocalDateTime StringToDateTime(String locatDateTime, String format) throws Exception {
		DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(format);
		LocalDateTime newDate = LocalDateTime.parse(locatDateTime, dateFormat);
		return newDate;
	}
	/**
	 * 作用：
	 * 把字符串转换为local型时间
	 * 作者：高嘉银
	 * 时间：2018年4月10日
	 * @param locatDate
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static LocalDate StringToLDateTime(String locatDate, String format) throws Exception {
		DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(format);
		LocalDate newDate = LocalDate.parse(locatDate, dateFormat);
		return newDate;
	}
	/**
	 * 作用:获取年月日 根据localDateTime类型的字符串获取到LocalDate类型字符串
	 *
	 * 作者:gjy 时间:2018年2月28日 上午9:15:07
	 * 
	 * @param localDateTime（必须为localDateTime型字符串）
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static String getYearMonthDay(String localDateTime, String format) throws Exception {
		String strLocalDate = null;
		LocalDateTime str = StringToDateTime(localDateTime, format);
		String year = String.valueOf(str.getYear());// 得到年份信息
		String month = String.valueOf(str.getMonthValue());// 得到月份信息
		String day = String.valueOf(str.getDayOfMonth());// 得到哪一天信息
		if (format.indexOf("/") > 0) {
			strLocalDate = year + "/" + month + "/" + day;
		} else if (format.indexOf("-") > 0) {
			strLocalDate = year + "-" + month + "-" + day;
		} else {
			strLocalDate = year + "年" + month + "月" + day + "日";
		}

		return strLocalDate;
	}

	/**
	 * 作用:获取LocalTime(获取时分秒时间)
	 * 
	 * 作者:gjy 时间:2018年2月28日 上午9:34:56
	 * 
	 * @param localDateTime
	 * @param format
	 * @return
	 * @throws Exception
	 */
	public static String getHourMinuteSecond(String localDateTime, String format) throws Exception {
		String strLocalTime = null;
		LocalDateTime str = StringToDateTime(localDateTime, format);
		String hour = String.valueOf(str.getHour());// 得到小时信息
		String minute = String.valueOf(str.getMinute());// 得到分钟信息
		String second = String.valueOf(str.getSecond());// 得到秒钟信息
		if (format.indexOf("/") > 0) {
			strLocalTime = hour + ":" + minute + ":" + second;
		} else if (format.indexOf("-") > 0) {
			strLocalTime = hour + ":" + minute + ":" + second;
		} else {
			strLocalTime = hour + "时" + minute + "分" + second + "秒";
		}
		return strLocalTime;
	}

	/**
	 * 作用: 判断一个时间是否在另一个时间的后面，数据格式为localDateTime
	 *  作者:gjy 时间:2018年2月28日 上午11:07:15
	 * 
	 * @param localDateTime（要比较的数据）
	 * @param compareTime（被比较的数据）
	 * @param format(localDateTime的格式)
	 * @return
	 * @throws Exception
	 */
	public static int afterTimeOrBefore(String localDateTime, String compareTime, String format) throws Exception {
		LocalDateTime str = StringToDateTime(localDateTime, format);
		LocalDateTime cstr = StringToDateTime(compareTime, format);
		if (str.isAfter(cstr)) {
			return 1;// 代表在比较的时间后面
		} else if (str.isBefore(cstr)) {
			return -1;// 代表在比较的时间前面
		} else {
			return 0;// 代表两个时间相等
		}
	}

	/**
	 * 作用: 判断两个时间之间间隔多少日期或者多少小时，或者多少分钟，或者多少秒钟，返回值String字符串
	 * 
	 *  作者:gjy 时间:2018年2月28日 上午11:26:13
	 * 
	 * @param from
	 * @param to
	 * @param format
	 * @param type(传入的类型参数：需要返回的时间是（D|H|M|S）)
	 * @return
	 * @throws Exception
	 */
	public static int getDistanceTime(String from, String to, String format,String type) throws Exception {
		int time;
		LocalDateTime str = StringToDateTime(from, format);
		LocalDateTime str2 = StringToDateTime(to, format);
		Duration duration = Duration.between(str,str2);
		switch(type) {
		case "D":time=(int) duration.toDays();
		break;
		case "H":time=(int) duration.toHours();
		break;
		case "M":time=(int) duration.toMinutes();
		break;
		case "S":time=(int) duration.toMillis();
		break;
		default:time=(int) duration.toDays();
		}
		return time;
	}

	/**
	 * 作用:加法
	 * 对一个字符串时间进行加运算(目前只针对LocalDateTime型的日期进行操作)
	 * 作者:gjy
	 * 时间:2018年3月6日 下午3:09:39
	 * @param LocalDateTime
	 * @param param（要进行加减的参数数据）
	 * @param name（时间枚举常量）
	 * @return
	 * @throws Exception 
	 */
	public static String addDateOperation(String LocalDateTime,int param,DateName Oname) throws Exception {
		LocalDateTime date=StringToDateTime(LocalDateTime,format);
		switch(Oname.name()) {
		case "YEAR":date=date.plusYears(param);
		break;
		case "MONTH":date=date.plusMonths(param);
		break;
		case "DAY":date=date.plusDays(param);
		break;
		case "HOUR":date=date.plusHours(param);
		break;
		case "MINUTE":date=date.plusMinutes(param);
		break;
		case "SECOND":date=date.plusSeconds(param);
		break;
		default:date=date.plusDays(0);
		}
		return dateTimeToString(date,format);
	}
	/**
	 * 作用:
	 * 时间的减法运算
	 * 作者:gjy
	 * 时间:2018年3月6日 下午3:29:54
	 * @param LocalDateTime
	 * @param param
	 * @param Option
	 * @param Oname
	 * @return
	 * @throws Exception
	 */
	public static String minusDateOperation(String LocalDateTime,int param,DateName Oname) throws Exception {
		LocalDateTime date=StringToDateTime(LocalDateTime,format);
		switch(Oname.name()) {
		case "YEAR":date=date.minusYears(param);
		break;
		case "MONTH":date=date.minusMonths(param);
		break;
		case "DAY":date=date.minusDays(param);
		break;
		case "HOUR":date=date.minusHours(param);
		break;
		case "MINUTE":date=date.minusMinutes(param);
		break;
		case "SECOND":date=date.minusSeconds(param);
		break;
		default:date=date.minusDays(0);
		}
		return dateTimeToString(date,format);
	}
	/**
	 * 作用：
	 * 传入一个localDate型的日期，获取该日期所在的那一周的所有日期数据
	 * 作者：高嘉银
	 * 时间：2018年4月10日
	 * @param localDate
	 * @return
	 */
	public static Map<String,Object> getWeekDays(String localDate1)throws Exception{
		Map<String,Object> week=new LinkedHashMap<String,Object>();
		LocalDate inputDate=null;
		if(localDate1!=null&&localDate1!="") {
			 inputDate = LocalDate.parse(localDate1);  
		}else {
			 inputDate = LocalDate.now();  
		}
		//获取当前时间所在周的第一天时间
		TemporalAdjuster FIRST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue()-DayOfWeek.MONDAY.getValue()));  
		LocalDate firstDay=inputDate.with(FIRST_OF_WEEK); 
		week.put(dateTimeToString(firstDay,"yyyy-MM-dd"),0);//设置周一的时间
		week.put(dateTimeToString(firstDay.plusDays(1),"yyyy-MM-dd"),0);//设置周二的时间
		week.put(dateTimeToString(firstDay.plusDays(2),"yyyy-MM-dd"),0);//设置周三的时间
		week.put(dateTimeToString(firstDay.plusDays(3),"yyyy-MM-dd"),0);//设置周四的时间
		week.put(dateTimeToString(firstDay.plusDays(4),"yyyy-MM-dd"),0);//设置周五的时间
		week.put(dateTimeToString(firstDay.plusDays(5),"yyyy-MM-dd"),0);//设置周六的时间
		week.put(dateTimeToString(firstDay.plusDays(6),"yyyy-MM-dd"),0);//设置周日的时间
		return week;
	}
	/**
	 * 作用：
	 * 获取某一时间的所属的那一周的开始时间和结束时间
	 * 作者：高嘉银
	 * 时间：2018年4月10日
	 * @param localDate1
	 * @return
	 * @throws Exception
	 */
	public static Map<String,Object> getWeekFirstAndLastDays(String localDate1)throws Exception{
		Map<String,Object> fromAndTo=new LinkedHashMap<String,Object>();
		LocalDate inputDate=null;
		if(localDate1!=null&&localDate1!="") {
			 inputDate = LocalDate.parse(localDate1);  
		}else {
			 inputDate = LocalDate.now();  
		}
		//获取当前时间所在周的第一天时间
		TemporalAdjuster FIRST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue()-DayOfWeek.MONDAY.getValue()));  
		LocalDate firstDay=inputDate.with(FIRST_OF_WEEK); 
		TemporalAdjuster LAST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));  
		LocalDate lastDay=inputDate.with(LAST_OF_WEEK);
		fromAndTo.put("from", dateTimeToString(firstDay,"yyyy-MM-dd"));
		fromAndTo.put("to", dateTimeToString(lastDay,"yyyy-MM-dd"));
		return fromAndTo;
	}
	public static void main(String[] args) throws Exception {
	}
}
